package 语法
//闭包就是一个代码块
def clouser = { println "hello groovy" }
//调用两种方式
clouser.call()
clouser()
println "------------------------------------"
def param = { String name -> println "hello groovy ${name}" }
//调用两种方式
param.call("test")
param()

println "------------------------------------"
def param2 = { String name, int age -> println "hello groovy ${name} , age = ${age}" }
param2.call("test", 2)

//闭包有一个默认的参数${it},这个是固定的，不用定义可以直接用
println "------------------------------------"
def param3 = { println "hello groovy ${it}" }
param3.call(11)

//上述的闭包虽然没有写返回值但其实是有返回值的是null

//闭包和基本类型结合使用
//求阶乘
int x = fab(5);
println x
int fab(int number) {
    int result = 1;
    //当前数从1开始，一直增加到number，对其中的每一项都传入闭包计算
    //
    1.upto(number, { num -> result = result * num });
    return result;
}
x = fab(5);
println x
int fab2(int number){
    int result = 1;
    //number.downto(1,{ num -> result = result * num })
    //闭包也可以放在括号外
    number.downto(1){
        num -> result = result * num
    }
    return result
}
println "------------------------------------"
int a = cal(101);
println a
int cal(int number){
    int result=0;
    //times起始值是从0开始，一直累加到number-1，每次都作为闭包的参数
    //调用闭包传几个参数，怎么传参，需要看源码
    number.times {
        num -> result+=num;
    }
    return result
}
println "------------------------------------"

//字符串与闭包结合使用
String str = "the 2 and 3 is 5"
//each方法遍历字符串的每个字符
//each方法的返回值就是原字符串
def each = str.each {
    String tmp -> print tmp.multiply(2)
        //每个字符都输出两次
        //tthhee  22  aanndd  33  iiss  55
}

println "${each} zxcxxzcxzcxz"
println "------------------------------------"
//通过find查找符合条件的第一个
//返回2，当遍历的字符满足条件的时候就会把字符返回回来
println str.find{
    String s -> s.isNumber()
}
println "------------------------------------"

//findAll方法返回就是集合，会找到所有的满足条件的字符，存储起来返回一个集合
//
def list = str.findAll{
    String s -> s.isNumber()
}
println list.toListString();
println "------------------------------------"

//any返回值是boolen，只要有一个满足条件就返回true
def res = str.any {
    String s -> s.isNumber()
}
println res
println "------------------------------------"
//every要所有的字符都要满足这个条件才返回true
res = str.every {
    String s -> s.isNumber()
}
println res
println "------------------------------------"
//将所有的字母遍历，对每个字符存储在集合中然后返回一个集合
def list2 = str.collect {
    it.toUpperCase()
}
println list2
println "------------------------------------"






